/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package service;

import entities.User;
import java.util.Collection;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.persistence.EntityManager;
import converter.UsersConverter;
import converter.UserConverter;
import javax.persistence.PersistenceContext;
import javax.ejb.Stateless;

/**
 *
 * @author Alex
 */

@Path("/users/")
@Stateless
public class UsersResource {

    @javax.ejb.EJB
    private UserResource userResource;

    @Context
    protected UriInfo uriInfo;

    @PersistenceContext(unitName = "uTaskPU")
    protected EntityManager em;
  
    /** Creates a new instance of UsersResource */
    public UsersResource() {
    }

    /**
     * Get method for retrieving a collection of User instance in XML format.
     *
     * @return an instance of UsersConverter
     */
    @GET
    @Produces({"application/xml", "application/json"})
    public UsersConverter get(@QueryParam("start") @DefaultValue("0") int start,
                              @QueryParam("max") @DefaultValue("10") int max,
                              @QueryParam("expandLevel") @DefaultValue("1") int expandLevel,
                              @QueryParam("query") @DefaultValue("SELECT e FROM User e") String query) {
        return new UsersConverter(getEntities(start, max, query), uriInfo.getAbsolutePath(), expandLevel);
    }

    /**
     * Post method for creating an instance of User using XML as the input format.
     *
     * @param data an UserConverter entity that is deserialized from an XML stream
     * @return an instance of UserConverter
     */
    @POST
    @Consumes({"application/xml", "application/json"})
    public Response post(UserConverter data) {
        User entity = data.resolveEntity(em);
        createEntity(data.resolveEntity(em));
        return Response.created(uriInfo.getAbsolutePath().resolve(entity.getUsrId() + "/")).build();
    }

    /**
     * Returns a dynamic instance of UserResource used for entity navigation.
     *
     * @return an instance of UserResource
     */
    @Path("{usrId}/")
    public UserResource getUserResource(@PathParam("usrId") Long id) {
        userResource.setId(id);
        userResource.setEm(em);
        return userResource;
    }

    @Path("u={username}&p={password}/")
    public UserResource authenticateUser(@PathParam("username") String username
            , @PathParam("password") String password) {
        userResource.setUsername(username);
        userResource.setPassword(password);
        userResource.setEm(em);
        return userResource;
    }

    /**
     * Returns all the entities associated with this resource.
     *
     * @return a collection of User instances
     */
    protected Collection<User> getEntities(int start, int max, String query) {
        return em.createQuery(query).setFirstResult(start).setMaxResults(max).getResultList();
    }

    /**
     * Persist the given entity.
     *
     * @param entity the entity to persist
     */
    protected void createEntity(User entity) {
        em.persist(entity);
    }
}
